package librairies.arborescence;

import librairies.arborescence.arbre.BinarbreDC;
import librairies.arborescence.interfaces.IBinarbre;
import librairies.exception.ArbreCyclique;
import librairies.exception.GreffeDeSousArbre;
import librairies.exception.SousArbreIncoherent;
import librairies.liste.interfaces.IListeE;
import librairies.liste.list.ListeDCE;

import org.junit.Test;

public class BinarbreDCTest
{
	@Test
	public void testexecut() throws NullPointerException, ArbreCyclique, GreffeDeSousArbre, SousArbreIncoherent //ok
	{
		IListeE<Integer> listInit = new ListeDCE<Integer>();
		listInit.add(2).add(3).add(4).add(5);
		IBinarbre<Integer> a1 = new BinarbreDC<Integer>(1).addAll(listInit);
		listInit = new ListeDCE<Integer>();
		listInit.add(4).add(3).add(2).add(1);
		IBinarbre<Integer> a2 = new BinarbreDC<Integer>(5).addAll(listInit);
		listInit = new ListeDCE<Integer>();
		listInit.add(5).add(12).add(11).add(8).add(9).add(4).add(2).add(10).add(5).add(11).add(10);
		IBinarbre<Integer> a3 = new BinarbreDC<Integer>(10).addAll(listInit); 
		System.out.println(a1+"*** a1 : "+a1.familySize()+" descendants ; hauteur : "+a1.height()+" contient 3 et 9 ? "+a1.containsVal(3)+a1.containsVal(9));
		System.out.println(a2+"*** a2 : "+a2.familySize()+" descendants ; hauteur : "+a2.height()+" contient 3 et 9 ? "+a2.containsVal(3)+a2.containsVal(9));
		System.out.println(a3+"*** a3 : "+a3.familySize()+" descendants ; hauteur : "+a3.height()+" contient 3 et 9 ? "+a3.containsVal(3)+a3.containsVal(9));
		System.out.println("*** generation 0 dans a3 :\n"+a3.gen(0));
		System.out.println("*** generation 1 dans a3 :\n"+a3.gen(1));
		System.out.println("*** generation 2 dans a3 :\n"+a3.gen(2));
		System.out.println("*** generation 3 dans a3 :\n"+a3.gen(3));
		System.out.println("*** generation 4 dans a3 :\n"+a3.gen(4));
		System.out.println("*** generation 5 dans a3 :\n"+a3.gen(5));
		System.out.println("*** generation 6 dans a3 :\n"+a3.gen(6));
		System.out.println(a1+"*** a1 : "+a1.prefixe());
		System.out.println("*** a1 : "+a1.infixe());
		System.out.println("*** a1 : "+a1.postfixe());
		System.out.println("*** a1 : "+a1.largeur());
		System.out.println(a2+"*** a2 : "+a2.prefixe());
		System.out.println("*** a2 : "+a2.infixe());
		System.out.println("*** a2 : "+a2.postfixe());
		System.out.println("*** a2 : "+a2.largeur());
		System.out.println(a3+"*** a3 : "+a3.prefixe());
		System.out.println("*** a3 : "+a3.infixe());
		System.out.println("*** a3 : "+a3.postfixe());
		System.out.println("*** a3 : "+a3.largeur());
		System.out.println("############# ON IMPRIME EN PLUS L'EQUILIBRAGE");
		BinarbreDC.printBalance=true;
		System.out.println("EQUILIBRAGE arbre 1 noeud :\n"+new BinarbreDC<Integer>(1).equilibre());
		System.out.println("EQUILIBRAGE arbre 2 noeud :\n"+new BinarbreDC<Integer>(1).addVal(2).equilibre());
		System.out.println("EQUILIBRAGE de :\n"+a1+"=>\n"+a1.equilibre()+"(hauteur : "+a1.height()+")");
		System.out.println("EQUILIBRAGE de :\n"+a2+"=>\n"+a2.equilibre()+"(hauteur : "+a2.height()+")");
		listInit = new ListeDCE<Integer>();
		listInit.add(13).add(14).add(15).add(16).add(17).add(18).add(19);
		System.out.println("EQUILIBRAGE de :\n"+a3.addAll(listInit)+"=>\n"+a3.equilibre()+"(hauteur : "+a3.height()+")");
		System.out.println("#############");
		System.out.println("a3 :\n"+a3+"** - 3 :"); a3 = a3.cutVal(3); System.out.println(a3+"(hauteur : "+a3.height()+")"); 
		System.out.println("** - 9 :"); a3 = a3.cutVal(9); System.out.println(a3+"(hauteur : "+a3.height()+")"); 
		System.out.println("** - 14 :"); a3 = a3.cutVal(14); System.out.println(a3+"(hauteur : "+a3.height()+")"); 
		System.out.println("** - 16 :"); a3 = a3.cutVal(16); System.out.println(a3+"(hauteur : "+a3.height()+")"); 
		System.out.println("** - 12 :"); a3 = a3.cutVal(12); System.out.println(a3+"(hauteur : "+a3.height()+")"); 
		System.out.println("EQUILIBRAGE :\n"+a3.equilibre()+"(hauteur : "+a3.height()+")");
		/*
			1        
			+-+      
			  2      
			  +-+    
			    3    
			    +-+  
			      4  
			      +-+
			        5
			*** a1 : 4 descendants ; hauteur : 4 contient 3 et 9 ? truefalse
			5
			|
			4
			|
			3
			|
			2
			|
			1
			*** a2 : 4 descendants ; hauteur : 4 contient 3 et 9 ? truefalse
			10      
			+-----+ 
			5     12
			+-+   | 
			4 8   11
			| +-+   
			2   9   
			*** a3 : 7 descendants ; hauteur : 3 contient 3 et 9 ? truefalse
			*** generation 0 dans a3 :
			( )
			*** generation 1 dans a3 :
			( 5    
			+-+  
			4 8  
			| +-+
			2   9
			 12
			| 
			11
			 )
			*** generation 2 dans a3 :
			( 4
			|
			2
			 8  
			+-+
			  9
			 11
			 )
			*** generation 3 dans a3 :
			( 2
			 9
			 )
			*** generation 4 dans a3 :
			( )
			*** generation 5 dans a3 :
			( )
			*** generation 6 dans a3 :
			( )
			1        
			+-+      
			  2      
			  +-+    
			    3    
			    +-+  
			      4  
			      +-+
			        5
			*** a1 : ( 1 2 3 4 5 )
			*** a1 : ( 1 2 3 4 5 )
			*** a1 : ( 5 4 3 2 1 )
			*** a1 : ( 1 2 3 4 5 )
			5
			|
			4
			|
			3
			|
			2
			|
			1
			*** a2 : ( 5 4 3 2 1 )
			*** a2 : ( 1 2 3 4 5 )
			*** a2 : ( 1 2 3 4 5 )
			*** a2 : ( 5 4 3 2 1 )
			10      
			+-----+ 
			5     12
			+-+   | 
			4 8   11
			| +-+   
			2   9   
			*** a3 : ( 10 5 4 2 8 9 12 11 )
			*** a3 : ( 2 4 5 8 9 10 11 12 )
			*** a3 : ( 2 4 9 8 5 11 12 10 )
			*** a3 : ( 10 5 12 4 8 11 2 9 )
			############# ON IMPRIME EN PLUS L'EQUILIBRAGE
			EQUILIBRAGE arbre 1 noeud :
			1(0)
			
			EQUILIBRAGE arbre 2 noeud :
			1(1)  
			+-+   
			  2(0)
			
			EQUILIBRAGE de :
			1(4)        
			+-+         
			  2(3)      
			  +-+       
			    3(2)    
			    +-+     
			      4(1)  
			      +-+   
			        5(0)
			=>
			3(0)         
			+------+     
			1(1)   4(1)  
			+-+    +-+   
			  2(0)   5(0)
			(hauteur : 2)
			EQUILIBRAGE de :
			5(-4)
			|    
			4(-3)
			|    
			3(-2)
			|    
			2(-1)
			|   
			1(0)
			=>
			3(0)         
			+------+     
			1(1)   4(1)  
			+-+    +-+   
			  2(0)   5(0)
			(hauteur : 2)
			EQUILIBRAGE de :
			10(5)                               
			+------------+                      
			5(0)         12(6)                  
			+-----+      +-----+                
			4(-1) 8(1)   11(0) 13(6)            
			|    +-+          +-+              
			2(0)   9(0)         14(5)          
			                     +-+            
			                       15(4)        
			                       +-+          
			                         16(3)      
			                         +-+        
			                           17(2)    
			                           +-+      
			                             18(1)  
			                             +-+    
			                               19(0)
			=>
			12(0)                                       
			+--------------------+                      
			8(0)                 16(0)                  
			+---------+          +-----------+          
			4(0)      10(0)      14(0)       18(0)      
			+----+    +----+     +-----+     +-----+    
			2(0) 5(0) 9(0) 11(0) 13(0) 15(0) 17(0) 19(0)
			(hauteur : 3)
			#############
			a3 :
			12(0)                                       
			+--------------------+                      
			8(0)                 16(0)                  
			+---------+          +-----------+          
			4(0)      10(0)      14(0)       18(0)      
			+----+    +----+     +-----+     +-----+    
			2(0) 5(0) 9(0) 11(0) 13(0) 15(0) 17(0) 19(0)
			** - 3 :
			12(0)                                       
			+--------------------+                      
			8(0)                 16(0)                  
			+---------+          +-----------+          
			4(0)      10(0)      14(0)       18(0)      
			+----+    +----+     +-----+     +-----+    
			2(0) 5(0) 9(0) 11(0) 13(0) 15(0) 17(0) 19(0)
			(hauteur : 3)
			** - 9 :
			12(0)                                    
			+-----------------+                      
			8(0)              16(0)                  
			+---------+       +-----------+          
			4(0)      10(1)   14(0)       18(0)      
			+----+    +-+     +-----+     +-----+    
			2(0) 5(0)   11(0) 13(0) 15(0) 17(0) 19(0)
			(hauteur : 3)
			** - 14 :
			12(0)                                
			+-----------------+                  
			8(0)              16(0)              
			+---------+       +-------+          
			4(0)      10(1)   13(1)   18(0)      
			+----+    +-+     +-+     +-----+    
			2(0) 5(0)   11(0)   15(0) 17(0) 19(0)
			(hauteur : 3)
			** - 16 :
			12(0)                              
			+-----------------+                
			8(0)              15(1)            
			+---------+       +-----+          
			4(0)      10(1)   13(0) 18(0)      
			+----+    +-+           +-----+    
			2(0) 5(0)   11(0)       17(0) 19(0)
			(hauteur : 3)
			** - 12 :
			11(0)                            
			+---------------+                
			8(-1)           15(1)            
			+---------+     +-----+          
			4(0)      10(0) 13(0) 18(0)      
			+----+                +-----+    
			2(0) 5(0)             17(0) 19(0)
			(hauteur : 3)
			EQUILIBRAGE :
			11(0)                         
			+--------------+              
			5(0)           17(0)          
			+------+       +-------+      
			2(1)   8(1)    13(1)   18(1)  
			+-+    +-+     +-+     +-+    
			  4(0)   10(0)   15(0)   19(0)
			(hauteur : 3)
		 */
	}
}
